UNPKG

bird-api

Version:
247 lines (239 loc) 27.6 kB
(function() { var Distribution, Name, _, util; Name = require('../models').Name; Distribution = require('../models').Distribution; util = require('../utilities'); _ = require('underscore'); module.exports = { doc: function(req, res) { return res.header('Content-Type', 'application/json; charset=utf-8').header('Access-Control-Allow-Origin', '*').json({ document: { title: '日本の野鳥 Web API', links: [ { rel: "git-repository", href: "https://github.com/KamataRyo/bird-api" } ] } }); }, ranks: function(req, res) { var fields, limit, offset, promise, rank, ranks, ref; res.header('Content-Type', 'application/json; charset=utf-8').header('Access-Control-Allow-Origin', '*'); ranks = req.params.ranks; rank = util.singular_for[ranks]; ref = util.parseQuery(req), fields = ref.fields, offset = ref.offset, limit = ref.limit; promise = Name.find({ rank: rank }).select(fields).skip(offset).limit(limit).exec(); return promise.then(function(results) { var obj; if (results.length < 1) { return res.status(404).json({ message: 'Unknown Resource' }); } else { if (ranks === 'birds') { ranks = 'species'; } return res.json(( obj = {}, obj["" + ranks] = results, obj )); } })["catch"](function(err) { return res.status(400).json({ message: 'bad request.' }); }); }, identifyName: function(req, res) { var fields, identifier, promise1, promise2, rank, ranks; ranks = req.params.ranks; rank = util.singular_for[ranks]; identifier = req.params.identifier; fields = util.parseQuery(req).fields; res.header('Content-Type', 'application/json; charset=utf-8').header('Access-Control-Allow-Origin', '*'); promise1 = Name.find({ rank: rank, ja: identifier }).select(fields).exec(); promise2 = Name.find({ rank: rank, ja: identifier }).exec(); return Promise.all([promise1, promise2]).then(function(arg) { var name, reference, references, results; results = arg[0], references = arg[1]; if (results.length < 1) { return res.status(404).json({ message: 'Unknown bird name' }); } else { name = results[0]; reference = references[0]; if (reference.upper_id != null) { return util.attachUpperTaxonomies({ name: name, reference: reference, fields: fields, callback: function(body) { return res.json(body); } }); } else { return res.json({ name: name }); } } })["catch"](function(err) { console.log(err); return res.status(500).json({ message: 'Internal Server Error' }); }); }, askExistence: function(req, res) { var fields, identifier; identifier = req.params.identifier; fields = util.parseQuery(req).fields; res.header('Content-Type', 'application/json; charset=utf-8').header('Access-Control-Allow-Origin', '*'); return Name.find({ rank: 'species', ja: identifier }).select(fields).exec().then(function(results) { var result; if (results.length > 0) { result = results[0]; return res.status(200).json({ existence: true, name: result }); } else { return res.status(200).json({ existence: false }); } })["catch"](function(err) { console.log(err); return res.status(500).json({ message: 'Internal Server Error' }); }); }, findInclusion: function(req, res) { var content; content = util.parseQuery(req).content; res.header('Content-Type', 'application/json; charset=utf-8').header('Access-Control-Allow-Origin', '*'); return Name.find({ rank: 'species' }).exec().then(function(allSpecies) { var frequency, histogram, i, ja, len, replaced, species; histogram = []; allSpecies.sort(function(a, b) { return b.ja.length - a.ja.length; }); for (i = 0, len = allSpecies.length; i < len; i++) { species = allSpecies[i]; ja = species.ja; replaced = content.replace(new RegExp(ja, 'g'), ''); if (content !== replaced) { frequency = (content.length - replaced.length) / ja.length; histogram.push({ species: species, frequency: frequency }); content = replaced; } } return res.status(200).json({ histogram: histogram }); })["catch"](function(err) { console.log(err); return res.status(500).json({ message: 'Internal Server Error' }); }); }, getDistributionsOf: function(req, res) { var identifier, promise1; identifier = req.params.identifier; res.header('Content-Type', 'application/json; charset=utf-8').header('Access-Control-Allow-Origin', '*'); return promise1 = Name.find({ rank: 'species', ja: identifier }).select('_id').exec().then(function(results) { var id; if (results.length < 1) { res.status(404); throw new Error('Unknown bird name'); } else { id = results[0]._id; console.log(id); return Distribution.find({ name_id: id }).exec().then(function(results) { return res.status(200).json({ name: identifier, distributions: results }); }); } })["catch"](function(err) { console.log(err); return res.status(500).json({ message: 'internal server erroe' }); }); }, postDistributionsOf: function(req, res) { var ja, place, ref; ref = [req.body.ja, req.body.place], ja = ref[0], place = ref[1]; res.header('Content-Type', 'application/json; charset=utf-8').header('Access-Control-Allow-Origin', '*'); if (!((ja != null) || (place != null))) { return res.status(404).json({ message: 'no `ja` or `place` field in body.' }); } else { return Name.find({ rank: 'species', ja: ja }).exec().then(function(results) { var name_id; if (results.length < 1) { res.status(404).json({ message: 'no birdname registered.' }); throw new Error('Unknown bird name'); } else { name_id = results[0]._id; return new Distribution({ name_id: name_id, place: place }).save(function(err) { if (err) { return res.status(500).json({ message: 'iteranal server error.' }); } else { return res.status(200).json({ species: results[0], message: 'post success.', distribution: { name_id: name_id, place: place } }); } }); } }); } } }; }).call(this); //# sourceMappingURL=data:application/json;base64,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QUFVLE9BQUEsS0FBVjttQkFIWjtpQkFGVixFQUxKOztZQURFLENBRE4sRUFQUjs7UUFERSxDQUhWLEVBTEo7O0lBUGlCLENBNU1yQjs7QUFOSiIsImZpbGUiOiJyb3V0ZXMvaW5kZXguanMiLCJzb3VyY2VSb290IjoiL3NvdXJjZS8iLCJzb3VyY2VzQ29udGVudCI6WyIjIGFwcC9yb3V0ZXNcbk5hbWUgICAgICAgICA9IHJlcXVpcmUoJy4uL21vZGVscycpLk5hbWVcbkRpc3RyaWJ1dGlvbiA9IHJlcXVpcmUoJy4uL21vZGVscycpLkRpc3RyaWJ1dGlvblxudXRpbCAgICA9IHJlcXVpcmUgJy4uL3V0aWxpdGllcydcbl8gICAgICAgPSByZXF1aXJlICd1bmRlcnNjb3JlJ1xuXG5tb2R1bGUuZXhwb3J0cyA9XG4gICAgZG9jOiAocmVxLCByZXMpIC0+XG4gICAgICAgIHJlc1xuICAgICAgICAgICAgLmhlYWRlciAnQ29udGVudC1UeXBlJywgJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9dXRmLTgnXG4gICAgICAgICAgICAuaGVhZGVyICdBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW4nLCAnKidcbiAgICAgICAgICAgIC5qc29uIGRvY3VtZW50OlxuICAgICAgICAgICAgICAgIHRpdGxlOifml6XmnKzjga7ph47ps6UgV2ViIEFQSSdcbiAgICAgICAgICAgICAgICBsaW5rczpbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbDpcImdpdC1yZXBvc2l0b3J5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGhyZWY6XCJodHRwczovL2dpdGh1Yi5jb20vS2FtYXRhUnlvL2JpcmQtYXBpXCJcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF1cblxuXG4gICAgcmFua3M6IChyZXEsIHJlcykgLT5cbiAgICAgICAgcmVzXG4gICAgICAgICAgICAuaGVhZGVyICdDb250ZW50LVR5cGUnLCAnYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD11dGYtOCdcbiAgICAgICAgICAgIC5oZWFkZXIgJ0FjY2Vzcy1Db250cm9sLUFsbG93LU9yaWdpbicsICcqJ1xuICAgICAgICAjIGdldCBwbHVyYWwgZm9ybSBvZiByYW5rXG4gICAgICAgIHJhbmtzID0gcmVxLnBhcmFtcy5yYW5rc1xuICAgICAgICByYW5rID0gdXRpbC5zaW5ndWxhcl9mb3JbcmFua3NdXG5cbiAgICAgICAgeyBmaWVsZHMsIG9mZnNldCwgbGltaXQgfSA9IHV0aWwucGFyc2VRdWVyeSByZXFcblxuICAgICAgICBwcm9taXNlID0gTmFtZVxuICAgICAgICAgICAgLmZpbmQge3Jhbmt9XG4gICAgICAgICAgICAuc2VsZWN0IGZpZWxkc1xuICAgICAgICAgICAgLnNraXAgb2Zmc2V0ICMgbWFwIHNraXAgYXMgb2Zmc2V0IGZvciByZXF1ZXN0XG4gICAgICAgICAgICAubGltaXQgbGltaXRcbiAgICAgICAgICAgIC5leGVjKClcblxuICAgICAgICBwcm9taXNlXG4gICAgICAgICAgICAudGhlbiAocmVzdWx0cykgLT5cbiAgICAgICAgICAgICAgICBpZiByZXN1bHRzLmxlbmd0aCA8IDFcbiAgICAgICAgICAgICAgICAgICAgcmVzXG4gICAgICAgICAgICAgICAgICAgICAgICAuc3RhdHVzIDQwNFxuICAgICAgICAgICAgICAgICAgICAgICAgLmpzb24gbWVzc2FnZTogJ1Vua25vd24gUmVzb3VyY2UnXG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAjIHNldCBBbGlhc1xuICAgICAgICAgICAgICAgICAgICBpZiByYW5rcyBpcyAnYmlyZHMnIHRoZW4gcmFua3MgPSAnc3BlY2llcydcblxuICAgICAgICAgICAgICAgICAgICByZXMuanNvbiB7IFwiI3tyYW5rc31cIjpyZXN1bHRzIH1cblxuICAgICAgICAgICAgLmNhdGNoIChlcnIpIC0+XG4gICAgICAgICAgICAgICAgcmVzXG4gICAgICAgICAgICAgICAgICAgIC5zdGF0dXMgNDAwXG4gICAgICAgICAgICAgICAgICAgIC5qc29uIG1lc3NhZ2U6J2JhZCByZXF1ZXN0LidcblxuXG4gICAgaWRlbnRpZnlOYW1lOiAocmVxLCByZXMpIC0+XG4gICAgICAgICMgcGFyc2UgcGFyYW1zXG4gICAgICAgIHJhbmtzID0gcmVxLnBhcmFtcy5yYW5rc1xuICAgICAgICByYW5rID0gdXRpbC5zaW5ndWxhcl9mb3JbcmFua3NdXG4gICAgICAgIGlkZW50aWZpZXIgPSByZXEucGFyYW1zLmlkZW50aWZpZXJcblxuICAgICAgICAjIHBhcnNlIHF1ZXJpZXNcbiAgICAgICAgeyBmaWVsZHMgfSA9IHV0aWwucGFyc2VRdWVyeSByZXFcblxuICAgICAgICByZXNcbiAgICAgICAgICAgIC5oZWFkZXIgJ0NvbnRlbnQtVHlwZScsICdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04J1xuICAgICAgICAgICAgLmhlYWRlciAnQWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2luJywgJyonXG5cbiAgICAgICAgcHJvbWlzZTEgPSBOYW1lXG4gICAgICAgICAgICAuZmluZCB7cmFuaywgamE6aWRlbnRpZmllcn1cbiAgICAgICAgICAgIC5zZWxlY3QgZmllbGRzXG4gICAgICAgICAgICAuZXhlYygpXG5cbiAgICAgICAgcHJvbWlzZTIgPSBOYW1lXG4gICAgICAgICAgICAuZmluZCB7cmFuaywgamE6aWRlbnRpZmllcn1cbiAgICAgICAgICAgIC5leGVjKClcblxuICAgICAgICBQcm9taXNlLmFsbCBbcHJvbWlzZTEsIHByb21pc2UyXVxuICAgICAgICAgICAgLnRoZW4gKFtyZXN1bHRzLCByZWZlcmVuY2VzXSkgLT5cbiAgICAgICAgICAgICAgICBpZiByZXN1bHRzLmxlbmd0aCA8IDFcbiAgICAgICAgICAgICAgICAgICAgcmVzXG4gICAgICAgICAgICAgICAgICAgICAgICAuc3RhdHVzIDQwNFxuICAgICAgICAgICAgICAgICAgICAgICAgLmpzb24gIG1lc3NhZ2U6J1Vua25vd24gYmlyZCBuYW1lJ1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgbmFtZSA9IHJlc3VsdHNbMF1cbiAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlID0gcmVmZXJlbmNlc1swXVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIHJlZmVyZW5jZS51cHBlcl9pZD9cbiAgICAgICAgICAgICAgICAgICAgICAgICMgZ2V0IHVwcGVyIHRheG9ub21pZXMgcmVjdXJzaXZlbHkgaW4gdGhpcyBmdW5jdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgdXRpbC5hdHRhY2hVcHBlclRheG9ub21pZXMge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgICAgICAjIGZpbHRlcmVkIG9iamVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZSAjIG5vbi1maWx0ZXJlZCBvbmplY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZHMgICAgIyBmaWx0ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjazogKGJvZHkpIC0+IHJlcy5qc29uIGJvZHlcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzLmpzb24geyBuYW1lIH1cblxuICAgICAgICAgICAgLmNhdGNoIChlcnIpIC0+XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2cgZXJyXG4gICAgICAgICAgICAgICAgcmVzXG4gICAgICAgICAgICAgICAgICAgIC5zdGF0dXMgNTAwXG4gICAgICAgICAgICAgICAgICAgIC5qc29uIG1lc3NhZ2U6J0ludGVybmFsIFNlcnZlciBFcnJvcidcblxuXG4gICAgYXNrRXhpc3RlbmNlOiAocmVxLCByZXMpIC0+XG4gICAgICAgICMgcGFyc2UgcGFyYW1zXG4gICAgICAgIGlkZW50aWZpZXIgPSByZXEucGFyYW1zLmlkZW50aWZpZXJcblxuICAgICAgICAjIHBhcnNlIHF1ZXJpZXNcbiAgICAgICAgeyBmaWVsZHMgfSA9IHV0aWwucGFyc2VRdWVyeSByZXFcblxuICAgICAgICByZXNcbiAgICAgICAgICAgIC5oZWFkZXIgJ0NvbnRlbnQtVHlwZScsICdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04J1xuICAgICAgICAgICAgLmhlYWRlciAnQWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2luJywgJyonXG5cbiAgICAgICAgTmFtZVxuICAgICAgICAgICAgLmZpbmQge3Jhbms6J3NwZWNpZXMnLCBqYTppZGVudGlmaWVyfVxuICAgICAgICAgICAgLnNlbGVjdCBmaWVsZHNcbiAgICAgICAgICAgIC5leGVjKClcbiAgICAgICAgICAgIC50aGVuIChyZXN1bHRzKSAtPlxuICAgICAgICAgICAgICAgIGlmIHJlc3VsdHMubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHRzWzBdXG4gICAgICAgICAgICAgICAgICAgIHJlc1xuICAgICAgICAgICAgICAgICAgICAgICAgLnN0YXR1cyAyMDBcbiAgICAgICAgICAgICAgICAgICAgICAgIC5qc29uIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGVuY2U6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiByZXN1bHRcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHJlc1xuICAgICAgICAgICAgICAgICAgICAgICAgLnN0YXR1cyAyMDBcbiAgICAgICAgICAgICAgICAgICAgICAgIC5qc29uIGV4aXN0ZW5jZTogZmFsc2VcbiAgICAgICAgICAgIC5jYXRjaCAoZXJyKSAtPlxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nIGVyclxuICAgICAgICAgICAgICAgIHJlc1xuICAgICAgICAgICAgICAgICAgICAuc3RhdHVzIDUwMFxuICAgICAgICAgICAgICAgICAgICAuanNvbiBtZXNzYWdlOidJbnRlcm5hbCBTZXJ2ZXIgRXJyb3InXG5cblxuICAgIGZpbmRJbmNsdXNpb246IChyZXEsIHJlcykgLT5cbiAgICAgICAgIyBwYXJzZSBxdWVyaWVzXG4gICAgICAgIHsgY29udGVudCB9ID0gdXRpbC5wYXJzZVF1ZXJ5IHJlcVxuXG4gICAgICAgIHJlc1xuICAgICAgICAgICAgLmhlYWRlciAnQ29udGVudC1UeXBlJywgJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9dXRmLTgnXG4gICAgICAgICAgICAuaGVhZGVyICdBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW4nLCAnKidcblxuICAgICAgICBOYW1lXG4gICAgICAgICAgICAuZmluZCB7cmFuazonc3BlY2llcyd9XG4gICAgICAgICAgICAuZXhlYygpXG4gICAgICAgICAgICAudGhlbiAoYWxsU3BlY2llcykgLT5cbiAgICAgICAgICAgICAgICBoaXN0b2dyYW0gPSBbXVxuICAgICAgICAgICAgICAgICMgc29ydCBhbGxTcGVjaWVzXG4gICAgICAgICAgICAgICAgYWxsU3BlY2llcy5zb3J0IChhLCBiKS0+XG4gICAgICAgICAgICAgICAgICAgIGIuamEubGVuZ3RoIC0gYS5qYS5sZW5ndGhcblxuICAgICAgICAgICAgICAgICMgZmluZCBzcGVjaWVzIG5hbWVcbiAgICAgICAgICAgICAgICBmb3Igc3BlY2llcyBpbiBhbGxTcGVjaWVzXG4gICAgICAgICAgICAgICAgICAgIGphID0gc3BlY2llcy5qYVxuICAgICAgICAgICAgICAgICAgICByZXBsYWNlZCA9IGNvbnRlbnQucmVwbGFjZSAobmV3IFJlZ0V4cCBqYSwgJ2cnKSwgJydcbiAgICAgICAgICAgICAgICAgICAgaWYgY29udGVudCBpc250IHJlcGxhY2VkICMgc3BlY2llcyBuYW1lIGZvdW5kXG4gICAgICAgICAgICAgICAgICAgICAgICBmcmVxdWVuY3kgPSAoY29udGVudC5sZW5ndGggLSByZXBsYWNlZC5sZW5ndGgpIC8gamEubGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgICAgICBoaXN0b2dyYW0ucHVzaCB7IHNwZWNpZXMsIGZyZXF1ZW5jeSB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50ID0gcmVwbGFjZWRcbiAgICAgICAgICAgICAgICByZXNcbiAgICAgICAgICAgICAgICAgICAgLnN0YXR1cyAyMDBcbiAgICAgICAgICAgICAgICAgICAgLmpzb24geyBoaXN0b2dyYW0gfVxuXG4gICAgICAgICAgICAuY2F0Y2ggKGVycikgLT5cbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyBlcnJcbiAgICAgICAgICAgICAgICByZXNcbiAgICAgICAgICAgICAgICAgICAgLnN0YXR1cyA1MDBcbiAgICAgICAgICAgICAgICAgICAgLmpzb24gbWVzc2FnZTonSW50ZXJuYWwgU2VydmVyIEVycm9yJ1xuXG5cbiAgICBnZXREaXN0cmlidXRpb25zT2Y6IChyZXEsIHJlcykgLT5cbiAgICAgICAgIyBwYXJzZSBwYXJhbXNcbiAgICAgICAgaWRlbnRpZmllciA9IHJlcS5wYXJhbXMuaWRlbnRpZmllclxuICAgICAgICByZXNcbiAgICAgICAgICAgIC5oZWFkZXIgJ0NvbnRlbnQtVHlwZScsICdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04J1xuICAgICAgICAgICAgLmhlYWRlciAnQWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2luJywgJyonXG5cbiAgICAgICAgcHJvbWlzZTEgPSBOYW1lXG4gICAgICAgICAgICAuZmluZCB7cmFuazonc3BlY2llcycsIGphOmlkZW50aWZpZXJ9XG4gICAgICAgICAgICAuc2VsZWN0ICdfaWQnXG4gICAgICAgICAgICAuZXhlYygpXG4gICAgICAgICAgICAudGhlbiAocmVzdWx0cykgLT5cbiAgICAgICAgICAgICAgICBpZiByZXN1bHRzLmxlbmd0aCA8IDFcbiAgICAgICAgICAgICAgICAgICAgcmVzXG4gICAgICAgICAgICAgICAgICAgICAgICAuc3RhdHVzIDQwNFxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IgJ1Vua25vd24gYmlyZCBuYW1lJ1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgaWQgPSByZXN1bHRzWzBdLl9pZFxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyBpZFxuICAgICAgICAgICAgICAgICAgICBEaXN0cmlidXRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIC5maW5kIHtuYW1lX2lkOiBpZH1cbiAgICAgICAgICAgICAgICAgICAgICAgIC5leGVjKClcbiAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuIChyZXN1bHRzKSAtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3RhdHVzIDIwMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuanNvbiB7bmFtZTppZGVudGlmaWVyLCBkaXN0cmlidXRpb25zOnJlc3VsdHN9XG5cbiAgICAgICAgICAgIC5jYXRjaCAoZXJyKSAtPlxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nIGVyclxuICAgICAgICAgICAgICAgIHJlc1xuICAgICAgICAgICAgICAgICAgICAuc3RhdHVzIDUwMFxuICAgICAgICAgICAgICAgICAgICAuanNvbiB7bWVzc2FnZTonaW50ZXJuYWwgc2VydmVyIGVycm9lJ31cblxuXG4gICAgcG9zdERpc3RyaWJ1dGlvbnNPZjogKHJlcSwgcmVzKSAtPlxuICAgICAgICAjIHBhcnNlIGJvZHlcbiAgICAgICAgW2phLCBwbGFjZV0gPSBbcmVxLmJvZHkuamEsIHJlcS5ib2R5LnBsYWNlXVxuICAgICAgICByZXNcbiAgICAgICAgICAgIC5oZWFkZXIgJ0NvbnRlbnQtVHlwZScsICdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04J1xuICAgICAgICAgICAgLmhlYWRlciAnQWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2luJywgJyonXG5cbiAgICAgICAgdW5sZXNzIGphPyBvciBwbGFjZT9cbiAgICAgICAgICAgIHJlc1xuICAgICAgICAgICAgICAgIC5zdGF0dXMgNDA0XG4gICAgICAgICAgICAgICAgLmpzb24ge21lc3NhZ2U6ICdubyBgamFgIG9yIGBwbGFjZWAgZmllbGQgaW4gYm9keS4nfVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICBOYW1lXG4gICAgICAgICAgICAgICAgLmZpbmQge3Jhbms6J3NwZWNpZXMnLCBqYX1cbiAgICAgICAgICAgICAgICAuZXhlYygpXG4gICAgICAgICAgICAgICAgLnRoZW4gKHJlc3VsdHMpIC0+XG4gICAgICAgICAgICAgICAgICAgIGlmIHJlc3VsdHMubGVuZ3RoIDwgMVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnN0YXR1cyA0MDRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuanNvbiB7bWVzc2FnZTogJ25vIGJpcmRuYW1lIHJlZ2lzdGVyZWQuJ31cbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvciAnVW5rbm93biBiaXJkIG5hbWUnXG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVfaWQgPSByZXN1bHRzWzBdLl9pZFxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERpc3RyaWJ1dGlvbiB7bmFtZV9pZCwgcGxhY2V9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNhdmUgKGVycikgLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgZXJyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3RhdHVzIDUwMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5qc29uIHttZXNzYWdlOidpdGVyYW5hbCBzZXJ2ZXIgZXJyb3IuJ31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnN0YXR1cyAyMDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuanNvbiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZXM6IHJlc3VsdHNbMF1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ3Bvc3Qgc3VjY2Vzcy4nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3RyaWJ1dGlvbjoge25hbWVfaWQsIHBsYWNlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiJdfQ==